#include "texto.h"

//SDL_Surface *stexto1;                                                            // texto
//TTF_Font *fuente1;                                                               // tipo de fuente
//extern SDL_Surface *screen;                                                     // main screen (pantalla principal)
//char msg1[20]; 


//ejemplo para inicializar: Cfuente arcade8(8,"arcadeclassic.ttf")
Cfuente::Cfuente ()
{
  filtro = 1; //0 nearest, 1 linear, 2 repeat
  usaalpha=true; // por defecto
  visible = true;
  alpha = 255; // 255 = opaco
  escala=1.0;
  rotacionX=0.0;
  rotacionY=0.0;
  rotacionZ=0.0;
}

void Cfuente::crea_fuentes(int dimension,char nombre[128])
{
  /* primero inciamos ttf */
  if (TTF_Init()<0)  printf ("CFuente::Crea_Fuentes:No se ha iniciado las fuents TTF/n");
  /*si todo es correcto cargamos la fuente */
  fuente = TTF_OpenFont(nombre,dimension);
  if (fuente == NULL ) printf("CFuente::Crea_Fuentes:No se pudo cargar la fuente: %s\n",nombre); 
  /* creamos y llenamos las distintas variables que usa la fuente */
  fgcolor.r=255;                                                                  // color de la fuente rgb
  fgcolor.g=255;
  fgcolor.b=255;
  bgcolor.r=0;                                                                // color del fondo rgb
  bgcolor.g=0;                                                                  // usameos el color key rosa 255,0,255
  bgcolor.b=0; 
  textura=Crea_Imagen_Alpha1 ( dimension, dimension );
  SDL_Rect dest_rect ={0,0,dimension,dimension};
  SDL_Rect srce_rect ={0,0,dimension,dimension}; 
  char b[0];                                                                    // para usar como letra
    for (int i=1;i<129;i++)
  {
    b[0]=i;                                                                     // pasa numero a letra
    SDL_FillRect(textura, NULL, 0x00000000);                                    // borra la textura cada vez que la aztualiza.
    stexto = TTF_RenderText_Shaded(fuente,b,fgcolor,bgcolor);                   // renderiza las fuentes.
    //stexto = TTF_RenderText_Solid(fuente,letra,fgcolor);                     // renderiza a stexto en modod solid.
    //stexto = TTF_RenderText_Blended(fuente,letra,fgcolor);                   // renderiza a stexto en modo blend.
    srce_rect.w =stexto->w;                                                     // datos de corte de la fuente
    srce_rect.h =stexto->h;                                                     //
    if (usaalpha) SDL_SetColorKey( stexto, SDL_SRCCOLORKEY, SDL_MapRGB(stexto->format, 0, 0, 0) ); // fija el color trasnparente para el alpha
    SDL_SetAlpha(stexto, SDL_SRCALPHA, alpha);                                  // fija el nivel de trasnparanecia 255 opaco , 0 transparente
    SDL_BlitSurface (stexto,&srce_rect,textura,&dest_rect);                     // cortamos segun lo indicado por los rects
    glGenTextures (1, &textid);                                                 // genera textura
    glBindTexture (GL_TEXTURE_2D , textid);                                     // la vincula
    glTexImage2D (GL_TEXTURE_2D, 0 ,4,textura->w,textura->h,0, GL_RGBA,GL_UNSIGNED_BYTE, textura->pixels );  //carga la textura en la memoria de video
    texturas[i]=textid;                                                       // almacena las ids de las texturas.(i-1 porque no empieza en 0)
  }   
  SDL_FreeSurface(textura);                                                     // liberamos las superficies
  SDL_FreeSurface(stexto);                                                      //
  TTF_CloseFont(fuente);                                                        // liberamos la fuente
  ancho=dimension;
  alto =dimension;
  printf ("CFuente::Crea_Fuentes:Creada fuente: %s, de :%i x %i \n",nombre,srce_rect.w,srce_rect.h);
}

void Cfuente::escribe (int x,int y, char texto [255],int espacio)
{
  char a;   
  int longitud = strlen (texto); // numero de letras en la frase;
  int nancho;
  int nalto;
  int Ix;
  int Iy;
  int letrapos;
  for (int i=0;i<longitud;i++)
   {
    if (visible==false) return; // nuevo
    
    letrapos= texto[i];
    
    nancho=(ancho/2)-1;    // Para que se se puedan agrandar y rotar sober su propio eje
    nalto = (alto/2)-1;    // Para que se se puedan agrandar y rotar sober su propio eje
    Ix = int (x)+nancho;   // Para que se se puedan agrandar y rotar sober su propio eje
    Iy = int (y)+nalto;    // Para que se se puedan agrandar y rotar sober su propio eje
  
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glEnable(GL_TEXTURE_2D);
    //glBindTexture(GL_TEXTURE_2D,75);
    glBindTexture(GL_TEXTURE_2D,texturas[letrapos]);
    if (filtro==1){
     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR );
     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR );}
    if (filtro==0){
     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST );       // SIN FILTRO
     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);  }     // SIN FILTRO
    if (filtro==2){
     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S, GL_REPEAT);
     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T, GL_REPEAT); }  
 
    if (usaalpha) glEnable(GL_BLEND);                                           // nuevo!!
    //glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // a ver               // en pruebas no es necesario nunca mas?
    //glBlendFunc(GL_ONE_MINUS_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
    glTranslatef ( Ix, Iy, 0 );                                                   // Mueve el objeto
    glScalef (escala,escala,escala);                                              // produce el escalado
    glRotated (rotacionZ,0,0,1);                                                  // rota sobre el eje z
    glRotated (rotacionX,0,1,0);
    glRotated (rotacionY,0,0,1);
  
    glBegin (GL_QUADS);                                                         // Usamos el objeto Quads
    glTexCoord2d (1.0 , 0.0);
    glVertex3f (nancho,-nalto,0);
    
    glTexCoord2d (0.0 , 0.0);
    glVertex3f (-nancho,-nalto   ,0);
     
    glTexCoord2d (0.0 , 1.0);            
    glVertex3f (-nancho,nalto,0);
    
    glTexCoord2d (1.0 , 1.0);
    glVertex3f (nancho    ,nalto,0);    

    glEnd();                                                                    // fin
    glDisable(GL_BLEND); 
    if (espacio>0 ) x+=espacio;
     else x=x+ancho;
   }
}       
  
  
  /// notas pa borrar
  //  textura=SDL_CreateRGBSurface (SDL_SWSURFACE, 0,0,32,screen->format->Rmask,
  //   screen->format->Gmask,screen->format->Bmask,screen->format->Amask);   


void Cfuente::termina (void)
{
      glDeleteTextures ( 1, &textid );
      atexit(TTF_Quit);  // libera la libreria
}

